python干货:提防eval()函数的安全漏洞问题

您所在的位置:网站首页 eval函数 python python干货:提防eval()函数的安全漏洞问题

python干货:提防eval()函数的安全漏洞问题

2023-03-20 19:42| 来源: 网络整理| 查看: 265

0 分享至

用微信扫码二维码

分享至好友和朋友圈

eval()函数的使用非常简单。

Python中eval()函数将字符串str当成有效的表达式来求值并返回计算结果。

其函数声明如下:

其中,参数globals为字典形式,locals为任何映射对象,它们分别表示全局和局部命名空间。如果传入globals参数的字典中缺少__builtins__的时候,当前的全局命名空间将作为globals参数输入并且在表达式计算之前被解析。locals参数默认与globals相同,如果两者都省略的话,表达式将在eval()调用的环境中执行。

"eval is evil" (eval是邪恶的),这是一句广为人知的对eval的评价,它主要针对的是eval()的安全性。

那么eval存在什么样的安全漏洞呢?来看一个简单的例子:

上面这段代码的主要功能是:根据用户的输入,计算Python表达式的值。它有什么问 题呢?如果用户都是素质良好,没有不良目的的话,那么这段程序也许可以满足基本需求。

比如,输入l+sin(20)会输出结果1.91294525053。但如果它是一个Web页面的后台调用(当然,你需要做一定的修改),由于网络环境下运行它的用户并非都是可信任的,问题就出现了。因为eval()可以将任何字符串当作表达式求值,这也就意味着有空子可钻。

上面的例子 中假设用户输入_ifnport_("os").system("dir"),会有什么样的输出呢?你会惊讶地发现它会显示当前目录下的所有文件列表,输出如下:

于是有些不地道的人,他输入了如下字符串,可悲的事情发生了,当前目录下的所有文件都被删除了,包括test.py,而这一切没有任何提示,悄无声息。

试想,在网络环境下这是不是很危险?也许你会辩护,那是因为你没有在globals参数 中禁止全局命名空间的访问。好,我们按照你说的来试验一下:将函数ExpCalcBot修改一下,其中math_fun_list限定为几个常用的数学函数。

修改后的函数如下:

再次运行程序(请读者自行试验)你会惊喜地发现上面的命令被看着无效表达式,你的辩护是对的,这确实是我们想要的。很好,安全问题不再是个问题!但仔细想想真是这样的吗?

试试输入以下字符:

注:你可以在Python的安装目录下的Lib\site.py中找到其类的定义。读者也可以自行在 Python 解释器中输入 print().__class.__bases__[0].__subclasses__()看看输出结果是什么。

因此对于有经验的侵入者来说,他可能会有一系列强大的手段,使得eval可以解释和调 用这些方法,从而带来更大的破坏。此外,eval()函数也给程序的调试带来一定困难,要査 看eval()里面表达式具体的执行过程很难。

因此在实际应用过程中如果使用对象不是信任源,应该尽量避免使用eval.在需要使用eval的地方可用安全性更好的ast.literal.eval替代。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

/阅读下一篇/ 返回网易首页 下载网易新闻客户端


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3